package org.shop.controller.upload;

import java.io.IOException;
import java.lang.reflect.Executable;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * 简单文件上传
 * 
 * @author zqx
 *
 */
@WebServlet("/admin/upload1.do")
@MultipartConfig
public class Upload1Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1.获取非文件域的数据，仍然使用之前的getParameter和getParameterValues方法获取
		String filename = req.getParameter("filename") ;
		
		// 2.处理文件域控件，使用getPart()方法，实现文件的上传
		Part part = req.getPart("attach") ;
		
		// 3.文件上传 - 应该上传项目发布路径中，如何动态的获取项目的发布路径呢？
		// 项目源码路径 		-> E:\java\work\shop-demo\src\main\webapp\file
		// 项目发布运行路径 	-> E:\java\apache-tomcat-8.5.79\webapps\shop-demo
		// part.write("E:\\java\\apache-tomcat-8.5.79\\webapps\\shop-demo\\file\\aa.jpg");
		
		// 3.1、动态获取项目发布路径
		ServletContext servletContext = this.getServletContext() ;
		// 返回当前项目的真实物理路径
		String realPath = servletContext.getRealPath("/file/") ;
		
		// 3.2、动态获取上传文件的后缀（扩展名）
		// header = form-data; name="attach"; filename="girl.jpg"
	
		String header = part.getHeader("Content-Disposition") ;
		int from = header.indexOf("filename=") + 10;
		int to = header.length() - 1 ;
		String name = header.substring(from,to) ;
		
		int dotIndex = name.lastIndexOf(".");
		String ext = name.substring(dotIndex); // .jpeg
		
		// 控制上传文件的类型
		if(ext.equalsIgnoreCase(".exe") || ext.equalsIgnoreCase(".bat")) {
			throw new RuntimeException("上传文件异常");
		}
		
		
		// 3.3、获取上传文件的容量大小
		long size = part.getSize();
		System.out.println("容量大小：" + size + " 字节");
		
		// 模拟上传文件最大容量不能超过1M
		long maxSize = size / 1024 / 1024 ;
		if(maxSize > 1) {
			throw new RuntimeException("上传文件溢出");
		}
		
		// 3.4、上传文件
		part.write(realPath + filename + ext) ;
		
	}
}





